package main

import (
	"log"
	"time"
)

// 函数选项模式
// 做法 3：使用 Functional Option Pattern

type Server struct {
	host    string
	port    int
	timeout time.Duration
	macConn int
}

// 在这个模式中，我们定义一个 Option 函数类型：
type Option func(*Server)

// option 类型是一个函数类型，它接收一个参数 *Server. 然后 Server 的构造函数接收一个 Option 类型的不定参数
func New(options ...Option) *Server {
	svr := &Server{}

	for _, f := range options {
		f(svr)
	}

	return svr
}

//  定义选项，需要定义一系列相关返回 option的函数
func WithHost(host string) Option {
	return func(s *Server) {
		s.host = host
	}
}

func WithPort(port int) Option {
	return func(s *Server) {
		s.port = port
	}
}

func WithTimeout(timeout time.Duration) Option {
	return func(s *Server) {
		s.timeout = timeout
	}
}

func WithMaxConn(maxConn int) Option {
	return func(s *Server) {
		s.macConn = maxConn
	}
}

func (s *Server) Start() error {
	return nil
}

func main() {
	svr := New(
		WithHost("localhost"),
		WithPort(1234),
		WithTimeout(time.Minute),
		WithMaxConn(3),
	)

	if err := svr.Start(); err != nil {
		log.Fatal(err)
	}
}
